Gateway Intents と Discord.js の内部実装
注意
特に Intent が設定されていないイベントは常にクライアントに送信されるが、このページの更新が間に合っていない可能性がある。
GUILD_MEMBERS インテントが設定されていない場合でも自身についての GUILD_MEMBER_UPDATE イベントは送信される。
GUILD_MEMBERS インテントが設定されていない場合でも自身についての THREAD_MEMBERS_UPDATE イベントは送信される。
GUILD_MEMBERS ならびに GUILD_PRESENCES は特権としてマークされている。
Intentsはギルド関連とDM関連の大まかに2つに分けられる
ギルド関連
GUILDS (1 << 0)
以下の3つの場合に送信される
初回接続時(遅延ロードと呼ばれている挙動)
新しく自身がサーバーへ参加したとき
サーバーが再び利用可能になったとき
GUILD_PRESENCES インテントを有効にしていない場合、このイベントに含まれる guildMember ならびに presense は自身とボイスチャンネルに接続しているメンバーのもののみ
guildCreateイベント では新しく自身がサーバーへ参加した場合にイベントを受け取ることが出来る
サーバーが更新された場合に送信される
guildUpdateイベントを発火させる
このイベントの対象の guild は上書きされる
channels、members、roles、voiceStates は上書きされる
client.users、presences は追加され重複していた場合には上書きされる
絵文字の変更はマネージャーへの追加 / 変更 / 削除 を行い対応したイベントを発生させる
以下の2つの場合に送信される
自身がサーバーから脱退したとき Kick / Ban されたときならびにサーバーが削除されたとき
guild はマネージャーから削除される
guildDelete イベントを発火させる
guild.deleted = true
サーバーが障害などによって利用できなくなったとき
guildUnavailable イベントを発火させる
guild.available = false
役職が作成された場合に送信される
roleCreate イベントを発火させる
ただし、すでに role が cache に追加されている場合は既存の role の更新のみ行われ、イベントは発生しない
ただし、guild が cache に載っていない場合無視される
役職が更新された場合に送信される
ユーザーへの付与などではなく役職それ自体(名前など)の更新
roleUpdate イベントを発火させる
ただし、guild または role が cache にのっていない場合無視される
役職が削除された場合に送信される
cache から該当の役職が削除される
roleDelete イベントを発火させる
ただし、guild または role が cache にのっていない場合無視される
チャンネルが作成された場合に送信される
すでに cache に存在する場合その Channel は上書きされる
channelCreate イベントを発火させる
ただし、すでに cache に存在する場合イベントは発生しない
チャンネルが更新された場合に送信される
ただし、last_message_id が変更された場合でも無視される
既存のチャンネルはとりあえず更新される
チャンネルのタイプが更新されていた場合新しいインスタンスが作成されキャッシュに上書きされる
channelUpdate イベントを発火させる
ただし、cache に channel がのっていない場合無視される
チャンネルが削除された場合に送信される
ChannelManager.remove() を呼び出す
これは channelManager.cache から Channel を削除し、channel に guild が存在する場合 guildChannelManger.cache からも削除する。
DMChannel 以外のチャンネルが削除された場合 Channel の messages に保持されているメッセージの deleted フラグを立てる
channelDelete イベントを発火させる
ただし、cache に channel がのっていない場合無視される
ピン留め / 解除された場合に送信される
ただし、ピン留めされたメッセージが削除された場合は送信されない
channel.lastPinTimestamp = time.getTime() || null
最後にピン留めされたメッセージがピン留め解除された場合 null となる。
channelPinsUpdate イベントを発火させる
ただし、cache に channel がのっていない場合無視される
GUILD_MEMBERS (1 << 1)
サーバーにユーザーが参加した場合に送信される
guild.memberCount++
イベントに含まれていた Member と User は cache に追加される
guildMemberAdd イベントを発火させる
ただし、guild が cache にのっていない場合無視される
サーバーのユーザーの情報が更新された場合に送信される
GUILD_MEMBERS インテントが設定されていない場合でも自身についての GUILD_MEMBER_UPDATE イベントは送信される
member の情報が上書きされる
guildMemberUpdate イベントを発火させる
guild と member が cache にのっていない場合無視される
ユーザーが脱退した、Kick / Ban された場合に送信される
guild.memberCount--
voiceStateManager から該当のユーザーの情報を削除する
GuildMemberManager に存在せず、かつ client.options.partials に GuildMember がない場合を除いて上記に加えて次の処理が実行される
cache から削除する
詳しく述べると以下のような処理をしている
存在しない場合一度 cache に追加する
cache から削除する
member.deleted = true;
guildMemberRemove イベントを発火させる
これが内部的に使用している
すべてのメンバーを取得する場合以外は不要
GUILD_BANS (1 << 2)
ユーザーがサーバから ban された場合に送信される
cache から guild と user を取得し guildBanAdd イベントを発火させる
cache から guild と user が取得できなかった場合は無視される
ユーザーがサーバから ban 解除された場合に送信される
cache から guild と user を取得し guildBanRemove イベントを発火させる
cache から guild と user が取得できなかった場合は無視される
GUILD_EMOJIS (1 << 3)
絵文字が 追加 / 削除 / 更新された場合に送信される
マネージャーへの追加 / 変更 / 削除 を行い対応したイベントを発生させる
GUILD_INTEGRATIONS (1 << 4)
他サービスや他サーバーとの連携の設定が更新された場合に送信される
サーバ設定→Integrations
guildIntegrationsUpdateイベントを発火させる
guild が cacheにのってない場合無視される
GUILD_WEBHOOKS (1 << 5)
webhook が作成、更新、削除された場合に送信される
webhookUpdate イベントを発火させる
channel が cache にのってない場合無視される
GUILD_INVITES (1 << 6)
新しく招待が作成された場合に送信される
それに含まれる guild、user ( inviter と tagetUser )、channel は追加/更新される
inviteCreate イベントを発火させる
channel と guild が cache にのってない場合無視される
招待が削除された場合に送信される
それに含まれる guild、user ( inviter と tagetUser )、channel は追加/更新される
inviteDeleteイベントを発火させる
channel と guild が cache にのってない場合無視される
GUILD_VOICE_STATES (1 << 7)
ユーザーの通話に関する状態が更新されたときに送信される
guild が cache にのっていない場合無視される
ClientVoiceManager#onVoiceStateUpdateをdiscord apiからのペイロードで呼び出す
guild_idが含まれていなければ無視
channel_idが含まれていなければguild_idを用いてVoiceConnectionを取得し、切断しCollectionから該当のConnectionを削除する
そうでなければコネクションのチャンネルを更新し、セッションIdを更新する
member は追加または更新される
voiceStateUpdateイベントを発火させる
GUILD_PRESENCES (1 << 8)
もし cache に user がのっていなければ追加する
もし cache 内のユーザーと比較して user に更新があればuserUpdateイベントを発火させる
guild が cache にのっている
member が cache に存在せず、かつ api からのデータがメンバーがオフライン以外の状態となったということを示す場合、member を Manager に追加し、guildMemberAvailableイベントを発火させる
presence を Manager に追加、または更新する
presenceUpdateイベントを発火させる
これを指定しなければ含まれるのはVCにいるボットとユーザーのみとなる
これが内部的に使用している
withPresenceを指定しなければ不要
GUILD_MESSAGES (1 << 9)
メッセージが作成された場合に送信される
channel が cache にのっていないか message が cache に存在する場合無視される
message がcacheに追加され、user ならびに api からのデータに存在する場合 member が cache に追加あるいは更新される
Channel#lastMessageID、User#lastMessageID、User#lastMessageChannelIDが更新される
Message#member が存在する場合 GuildMemeber#lastMessageID、GuildMember#lastMessageChannelIDも更新される
messageCreate イベントを発火させるv13 メッセージが更新(編集)された場合に送信される
apiからのデータに channel に関する完全な情報が含まれておらず、かつChannelManager に存在せず、かつ client.options.partials に Channel がない場合、無視される
さらに、 api から messageに関する完全な情報が提供されず、かつMessageManagerに存在せず、かつ client.options.partials に Message がない場合も無視される
message を更新する
messageUpdateイベントを発火させる
メッセージが削除された場合に送信される
ただしバルクデリートは除く
apiからのデータに channel に関する完全な情報が含まれておらず、かつChannelManager に存在せず、かつ client.options.partials に Channel がない場合、無視される
さらに、 api から message に関連する完全な情報が提供されず、かつMessageManagerに存在せず、かつ client.options.partials に Message がない場合も無視される
cache から message を削除する
message.deleted = true
messageDelete イベントを発火させる
メッセージがバルクデリートされた場合に送信される
apiからのデータに channel に関する完全な情報が含まれておらず、かつChannelManager に存在せず、かつ client.options.partials に Channel がない場合、無視される
code:javascript
for (const id of ids) {
//client.options.partials に Message がない場合は、 api から 関連する完全な情報が提供されず、かつMessageManagerに存在しない message も無視される
const message = this.getMessage(
{
id,
guild_id: data.guild_id,
},
channel,
false
);
if (message) {
message.deleted = true;
messages.set(message.id, message);
channel.messages.cache.delete(id);
}
}
if (messages.size > 0) client.emit(Events.MESSAGE_BULK_DELETE, messages);
GUILD_MESSAGE_REACTIONS (1 << 10)
メッセージにリアクションが追加された場合に送信される
ユーザーあるいはメンバーが解決できなかった場合には無視される
client.options.partials が解決の際に考慮される
チャンネルおよびメッセージが解決できなかった場合にも無視される
client.options.partials に指定があれば不完全でながらも解決される
メッセージが不完全な場合はclient.options.partialsにREACTIONが指定されている必要がある
そうでなければ無視される
もしその絵文字のリアクションがメッセージに存在し、かつユーザーがリアクションをすでにしていれば無視される
リアクションをメッセージに追加するか、存在する場合はカウントを更新する
リアクションにユーザーを追加する
messageReactionAdd イベントを発火させる
メッセージからリアクションが削除された場合に送信される
ユーザー、チャンネル、メッセージ、リアクションが解決できなかった場合無視される
client.options.partials が解決の際に考慮される
リアクションからユーザーが削除される
結果としてメッセージからリアクションが削除されることがある
messageReactionRemove イベントを発火させる
明示的にメッセージからリアクションがすべて削除された場合に送信される
メッセージからリアクションがすべて削除される
チャンネル、メッセージが解決できなかった場合無視される
client.options.partials が解決の際に考慮される
messageReactionRemoveAll イベントを発火させる
メッセージからある絵文字のリアクション全てが削除されたときに送信される
チャンネル、メッセージ、リアクションが解決できなかった場合無視される
client.options.partials が解決の際に考慮される
messageReactionRemoveEmoji イベントを発火させる
GUILD_MESSAGE_TYPING (1 << 11)
ユーザーがチャンネルで入力を開始した場合に送信される
ユーザーあるいはメンバーが解決できなかった場合無視される
client.options.partials が解決の際に考慮される
DM関連。各イベントについて特にギルドと挙動が違うわけではないので詳細は省略
DIRECT_MESSAGES (1 << 12)
CHANNEL_CREATE
Gateway v8以降DMでは送信されない
MESSAGE_CREATE
MESSAGE_UPDATE
MESSAGE_DELETE
CHANNEL_PINS_UPDATE
DIRECT_MESSAGE_REACTIONS (1 << 13)
MESSAGE_REACTION_ADD
MESSAGE_REACTION_REMOVE
MESSAGE_REACTION_REMOVE_ALL
MESSAGE_REACTION_REMOVE_EMOJI
DIRECT_MESSAGE_TYPING (1 << 14)
TYPING_START